// Η μέθοδος "sinedriaProsklisiJQL" επιστρέφει jQuery element list για τα DOM elements
// προσκλήσεων που αφορούν στον σχετικό παίκτη.

Sinedria.prototype.sinedriaProsklisiJQL = function() {
	return Pektis.prosklisiJQL(this.pektis);
}

Pektis.prototype.pektisProsklisiJQL = function() {
	return Pektis.prosklisiJQL(this.login);
}

Pektis.prosklisiJQL = function(login) {
	var jql = $();
	$('.prosklisi').each(function() {
		if ($(this).find('.prosklisiOnoma').text() == login) jql = jql.add(this);
	});

	return jql;
}

Pektis.anazitisiJQL = function(login) {
	return $('#AZ' + login.jqsel());
}

Prosklisi.prototype.prosklisiAddDOM = function(zebra) {
	var prosklisi, id, pote, lel, del, title, kimeno, prosklisiArea;

	prosklisi = this;
	id = 'PR' + prosklisi.kodikos;
	if ($('#' + id).length) globals.fatal('Prosklisi.prosklisiDOM: ' + prosklisi.kodikos + ': πρόσκληση ήδη στο DOM');

	pote = globals.pote(prosklisi.epidosi);
	lel = $('<div>').attr({id: id}).addClass('prosklisi');
	del = $('<img>').attr({src: 'images/misc/Xred.png'}).addClass('prosklisiIcon').on('click', function(e) {
		Prosklisi.prosklisiDel(e, prosklisi);
	});

	if (prosklisi.pros != Prefadoros.ego.login) {
		lel.addClass('prosklisiPros');
		title = 'Πρόσκληση προς "' + prosklisi.pros;
		kimeno = 'προς <div class="prosklisiData prosklisiOnoma">' + prosklisi.pros + '</div>';
		del.attr({title: 'Ανάκληση πρόσκλησης'});
	}
	else {
		lel.addClass('prosklisiApo').on('click', function(e) {
			Prosklisi.apodoxi(e, prosklisi);
		});
		title = 'Κλικ για αποδοχή πρόσκλησης από "' + prosklisi.apo;
		kimeno = 'από <div class="prosklisiData prosklisiOnoma">' + prosklisi.apo + '</div>';
		del.attr({title: 'Απόρριψη πρόσκλησης'});
	}

	title += '" για το τραπέζι ' + prosklisi.trapezi + ', [ ' + pote + ' ]';
	kimeno += ', τραπέζι <div class="prosklisiData">' + prosklisi.trapezi + '</div>';
	kimeno += '<div class="prosklisiEpidosi">[&nbsp;' + pote + '&nbsp;]</div>';

	prosklisiArea = $('#prosklisiArea');
	lel.attr({title: title}).html(kimeno).prosklisiFixDOM(prosklisi).prepend(del).prependTo(prosklisiArea);
	if (zebra) Prosklisi.zebra(prosklisiArea);
	return prosklisi;
}

Prosklisi.prototype.prosklisiDelDOM = function() {
	$('#PR' + this.fetchProp('kodikos')).stop().fadeOut(50, function() {
		$(this).remove();
		Prosklisi.zebra();
	});

	return this;
}

Prosklisi.prototype.prosklisiTrapeziFixDOM = function() {
	$('#TR' + this.trapezi).trapeziDataFixDOM(Skiniko.fetchTrapezi(this.trapezi));
	return this;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

// Χρησιμοποιούμε την κλάση "Prosklisi" ως name space για κάποιες βοηθητικές
// function που αφορούν στις προσκλήσεις.

Prosklisi.zebra = function(prosklisiArea) {
	if (!prosklisiArea) prosklisiArea = $('#prosklisiArea');
	prosklisiArea.zevra();
}

// Η μέθοδος "prosklisi" αποστέλλει πρόσκληση στον παίκτη τού οποίου το login
// name περνάμε ως παράμετρο. Για να αποσταλεί πρόσκληση θα πρέπει ο τρέχων
// παίκτης κατά τη στιγμή τής προσκλήσεως να είναι παίκτης σε κάποιο τραπέζι.
// Αν ο παίκτης είναι διαχειριστής, μπορεί να στείλει προσκλήσεις και ως θεατής.
// Η function καλείται από διάφορα σημεία του προγράμματος, πάντα όμως μέσω κλικ
// του οποίου το event περνάμε ως πρώτη παράμετρο.

Prosklisi.apostoli = function(e, pros) {
	var trapezi, prosklisi;

	Prefadoros.input.apiko(e);
	e.preventDefault();
	trapezi = Prefadoros.ego.isTrapezi();
	if (!trapezi) return Client.fyi.epano('Ακαθόριστο τραπέζι', 2, 'beep.ogg');

	prosklisi = (new Prosklisi({
		'trapezi': trapezi.kodikos,
		'apo': Prefadoros.ego.login,
		'pros': pros,
	}));

	// Αν ο παίκτης μετέχει ως παίκτης στο τραπέζι η πρόσκληση
	// μπορεί να αποσταλεί.

	if (Prefadoros.ego.sinedria.isPektis()) return prosklisi.apostoli();

	// Ο παίκτης είναι μεν συσχετισμένος με κάποιο τραπέζι, αλλά
	// δεν μετέχει ως παίκτης στο εν λόγω τραπέζι. Σ' αυτή την
	// περίπτωση ο παίκτης μπορεί να αποστείλει πρόσκληση μόνο
	// εφόσον έχει τα κατάλληλα αξιώματα.

	if (Prefadoros.ego.pektis.oxiEpoptis()) return Client.fyi.
		spano('Δεν μπορείτε να αποστείλετε πρόσκληση ενώ δεν παίζετε στο τραπέζι');

	// Ο παίκτης θα αποστείλει πρόσκληση ως αξιωματικός και όχι
	// ως παίκτης. Σ' αυτή την περίπτωση είναι καλό να ερωτηθεί
	// ο παίκτης αν πράγματι επιθυμεί να αποστείλει πρόσκληση.

	$('.prosklisiDialogos').remove();
	$('<div class="dialogos prosklisiDialogos">' +
	'Θέλετε πράγματι να αποστείλετε πρόσκληση στον παίκτη <div class="dialogosData ble">' +
	pros + '</div> για το τραπέζι <div class="dialogosData ble">' + trapezi.kodikos +
	'</div> ως&nbsp;<div class="dialogosData">' + Prefadoros.ego.pektis.peparamDecode('ΑΞΙΩΜΑ') +
	'</div>;</div>').prependTo('#ofelimo').siromeno({top:'100px',left:'50px'}).pineza().
	anadisi().append($('<div class="dexia">').
		append($('<div>').dialogosButton('ΝΑΙ', function() {
			prosklisi.apostoli();
		})).
		append($('<div>').dialogosButton('ΟΧΙ'))
	);
	Client.sound.dialogos();
}

Prosklisi.prototype.apostoli = function() {
	var trapezi, i, prosklisi;

	if (!this.hasOwnProperty('trapezi')) globals.fatal('Prosklisi.apostoli: ακαθόριστο τραπέζι');
	if (!this.hasOwnProperty('apo')) globals.fatal('Prosklisi.apostoli: ακαθόριστος οικοδεσπότης');
	if (!this.hasOwnProperty('pros')) globals.fatal('Prosklisi.apostoli: ακαθόριστος προσκλεκλημένος');
	if (this.apo.oxiEgo()) globals.fatal('Prosklisi.apostoli: ' + this.apo + ': ξένος οικοδεσπότης');

	trapezi = Skiniko.fetchTrapezi(this.trapezi);
	for (i in trapezi.prosklisi) {
		prosklisi = trapezi.prosklisi[i];
		if (prosklisi.pros != this.pros) continue;
		if (prosklisi.apo.oxiEgo()) continue;
		return Client.fyi.spano('<span class="ble">' +
			'Έχετε ήδη αποστείλει πρόσκληση στον παίκτη ' +
			'<span class="prasino entono">' + this.pros + '</span> για το τραπέζι ' +
			'<span class="prasino entono">' + this.trapezi + '</span></span>');
	}

	Client.fyi.pano('Αποστολή πρόσκλησης προς: ' + this.pros + ', τραπέζι: ' + this.trapezi);
	Client.node('prosklisiAdd', 'pros=' + this.pros.uri(), function(rsp) {
		Client.fyi.spano(rsp);
	});
}

Prosklisi.prosklisiDel = function(e, prosklisi) {
	Prefadoros.input.apiko(e);
	Client.node('prosklisiDel', 'kodikos=' + prosklisi.kodikos, function(rsp) {
		if (rsp) return Client.fyi.spano(rsp);
	});
}

Prosklisi.prosklisiDelall = function(e, ico) {
	var src;

	Client.stopProp(e);
	src = $(ico).attr('src');
	$(ico).working('working/kokino.gif');
	Client.node('prosklisiDelall', function(rsp) {
		Client.fyi.epano(rsp);
		$(ico).attr({src: src});
	});
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

// Η function που ακολουθεί καλείται κατά την αποδοχή της προσκλήσεως.
// Αποδοχή πρόσκλησης έχουμε με κλικ επάνω στην ίδια την πρόσκληση.

Prosklisi.apodoxi = function(e, prosklisi) {
	var trapezi, jql;

	Client.stopProp(e);
	Prefadoros.input.apiko();

	// Αν ο παίκτης είναι περιφερόμενος, τότε προχωρούμε κατευθείαν
	// στην ένταξή μας στο τραπέζι.

	trapezi = Prefadoros.ego.isTrapezi();
	if (!trapezi) return Prosklisi.apodoxiTora(prosklisi);

	// Ο παίκτης βρίσκεται ήδη σε κάποιο τραπέζι. Ελέγχουμε αν αυτό
	// το τραπέζι είναι το τραπέζι της προσκλήσεως.

	if (trapezi.kodikos == prosklisi.trapezi) {
		if (trapezi.isPektis(Prefadoros.ego.sinedria.pektis) || trapezi.plires())
			return Client.fyi.pano('Βρίσκεστε ήδη στο τραπέζι <span class="ble entono">' +
				prosklisi.trapezi + '</span>', null, 'tilt.ogg');
	}

	// Ο παίκτης βρίσκεται σε τραπέζι που είναι ξένο από αυτό της 
	// προσκλήσεως.

	// Αν ο παίκτης δεν παίζει σε κάποιο τραπέζι, επιτρέπεται να
	// μεταβεί στο τραπέζι της προσκλήσεως.

	jql = Pektis.pektisBoxJQL(Prefadoros.ego.sinedria.pektis, {
		entos: 1,
	});
	if (!jql.length) return Prosklisi.apodoxiTora(prosklisi);

	// Αν το τραπέζι της προσκλήσεως είναι πλήρες, ο παίκτης μπορεί να μεταβεί
	// ως θεατής.

	if (Skiniko.fetchTrapezi(prosklisi.trapezi).plires()) return Prosklisi.apodoxiTora(prosklisi);

	// Ο παίκτης πρόκειται να μεταβεί ως παίκτης, αλλά ήδη παίζει στο τραπέζι
	// από το οποίο αποχωρεί. Αυτό επιτρέπεται μόνο όταν ο παίκτης είναι VIP.

	if (Prefadoros.ego.pektis.isVip()) return Prosklisi.apodoxiTora(prosklisi);

	// Αλλιώς μεταβαίνει ως θεατής.

	Skiniko.fetchTrapezi(prosklisi.trapezi).trapeziIsodos();

}

// Ακολουθεί η πραγματική αποδοχή τής προσκλήσεως. Εδώ αποστέλλεται σχετικό
// αίτημα στον Node server και τόσο εμείς, όσο και οι υπόλοιποι clients θα
// δεχθούμε τις συνέπειες της αποδοχής τής προσκλήσεως, μέσω κίνησης αλλαγής
// στοιχείων θέσης.

Prosklisi.apodoxiTora = function(prosklisi) {
	Client.node('prosklisiApodoxi', 'kodikos=' + prosklisi.kodikos, function(rsp) {
		if (rsp) return Client.fyi.spano(rsp);
	});
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////@

jQuery.fn.prosklisiFixDOM = function(prosklisi) {
	return this.each(function() {
		var login = (prosklisi.apo == Prefadoros.ego.login ? prosklisi.pros : prosklisi.apo);

		$(this).prosklisiOnlineFixDOM(login);
		$(this).prosklisiSxesiFixDOM(login);
	});
}

jQuery.fn.prosklisiOnlineFixDOM = function(login) {
	return this.each(function() {
		if (Skiniko.isSinedria(login)) $(this).removeClass('prosklisiOffline');
		else $(this).addClass('prosklisiOffline');
	});
}

jQuery.fn.prosklisiSxesiFixDOM = function(login) {
	return this.each(function() {
		if (Prefadoros.ego.pektis.isFilos(login))
			$(this).find('.prosklisiOnoma').removeClass('apoklismenos').addClass('filos');
		else if (Prefadoros.ego.pektis.isApoklismenos(login))
			$(this).find('.prosklisiOnoma').removeClass('filos').addClass('apoklismenos');
		else
			$(this).find('.prosklisiOnoma').removeClass('filos apoklismenos');
	});
}
